//package com.zomiot.portal.aichat.service;
//
//import jakarta.annotation.PostConstruct;
//import lombok.RequiredArgsConstructor;
//
//import org.springframework.ai.chat.StreamingChatClient;
//import org.springframework.ai.chat.prompt.Prompt;
//import org.springframework.ai.document.Document;
//import org.springframework.ai.reader.tika.TikaDocumentReader;
//import org.springframework.ai.transformer.splitter.TokenTextSplitter;
//import org.springframework.ai.vectorstore.SearchRequest;
//import org.springframework.ai.vectorstore.VectorStore;
//import org.springframework.core.io.ClassPathResource;
//import org.springframework.stereotype.Service;
//import reactor.core.publisher.Flux;
//
//import java.util.List;
//import java.util.stream.Collectors;
//
//
///**
// * @ClassName RagService
// * @Author 阿⭐
// * @Date 2025/11/5 15:44
// * @Description TODO
// */
//@Service
//@RequiredArgsConstructor
//public class RagService {
//
//    private final VectorStore vectorStore;
//    private final StreamingChatClient chatClient;
//
//    @PostConstruct
//    public void initKnowledgeBase() throws Exception {
//        // 防止重复加载
//        if (vectorStore.similaritySearch(SearchRequest.query("test").withTopK(1)).isEmpty()) {
//            loadDocuments();
//        }
//    }
//
//    private void loadDocuments() throws Exception {
//        var reader = new TikaDocumentReader(String.valueOf(new ClassPathResource("docs/").getURL()));
//        var docs = reader.get();
//        var splitDocs = new TokenTextSplitter().apply(docs);
//        vectorStore.add(splitDocs);
//        System.out.println("内存知识库加载完成，共 " + splitDocs.size() + " 条文档");
//    }
//
//    public Flux<String> ask(String question) {
//        // 1. 向量检索
//        List<Document> contexts = vectorStore.similaritySearch(
//                SearchRequest.query(question)
//                        .withTopK(4)
//                        .withSimilarityThreshold(0.7)
//        );
//        String contextStr = contexts.stream()
//                .map(Document::getContent)
//                .collect(Collectors.joining("\n\n"));
//
//        String promptText = """
//            你是企业官网 AI 助手，只基于以下资料回答，禁止胡编：
//            资料： %s
//            问题：%s
//            回答：
//            """.formatted(contextStr, question);
//
//        Prompt prompt = new Prompt(promptText);
//
//
//        // 2. 0.8.1 流式调用（已修改）
//        // chatClient.stream(Prompt) 返回 Flux<ChatResponse>，然后我们从中提取内容
//        return chatClient.stream(prompt)
//                .map(chatResponse -> String.valueOf(chatResponse.getResult()));
//    }
//}